package tzjz.example.util;

import cn.hutool.core.util.CharUtil;
import com.alibaba.fastjson.JSONObject;
import freemarker.template.TemplateException;
import net.sourceforge.pinyin4j.PinyinHelper;
import org.springframework.ui.ModelMap;
import org.springframework.util.ObjectUtils;

import java.io.IOException;
import java.util.*;

public class PinyinMatchWithDetailedResults {

    // 返回匹配的拼音结果（完全匹配、韵母正确但位置不对、韵母匹配但字不对）
    public static JSONObject getMatchingPinyinCharacters(String word1, String word2) {
        JSONObject matchingResults = new JSONObject();

        // 如果两个词长度不同，直接返回空结果
        if (word1.length() != word2.length()) {
            return matchingResults;
        }

        // 1. 字形完全一致，直接返回
        for (int i = 0; i < word1.length(); i++) {
            boolean bool = false;
            char char1 = word1.charAt(i);
            // 获取拼音
            String[] pinyin1 = PinyinHelper.toHanyuPinyinStringArray(char1);
            if (ObjectUtils.isEmpty(pinyin1)) {
                return null;
            }
            String key = CharUtil.toString(char1);

            for (int j = 0; j < word1.length(); j++) {
                char char2 = word2.charAt(j);
                String index = "位置正确";
                if (i != j) {
                    index = "位置不正确";
                }
                String[] pinyin2 = PinyinHelper.toHanyuPinyinStringArray(char2);
                // 如果拼音都能提取出来
                if (ObjectUtils.isEmpty(pinyin2)) {
                    return null;
                }

                if (char1 == char2) {
                    matchingResults.put(key, "词正确" + index);
                    bool = true;
                    break;
                }
            }
            if (bool) {
                continue;
            }
            for (int j = 0; j < word1.length(); j++) {
                char char2 = word2.charAt(j);
                String index = "位置正确";
                if (i != j) {
                    index = "位置不正确";
                }
                String[] pinyin2 = PinyinHelper.toHanyuPinyinStringArray(char2);
                // 如果拼音都能提取出来
                if (ObjectUtils.isEmpty(pinyin2)) {
                    return null;
                }
                //字形不同，拼音一致（即拼音完全相同）
                if (comparePinyins(pinyin1[0], pinyin2[0])) {
                    matchingResults.put(key, "拼音正确" + index);
                    bool = true;
                    break;
                }
            }
            if (bool) {
                continue;
            }
            for (int j = 0; j < word1.length(); j++) {
                char char2 = word2.charAt(j);
                String index = "位置正确";
                if (i != j) {
                    index = "位置不正确";
                }
                String[] pinyin2 = PinyinHelper.toHanyuPinyinStringArray(char2);
                // 如果拼音都能提取出来
                if (ObjectUtils.isEmpty(pinyin2)) {
                    return null;
                }
                // 字形不同，声母不同，韵母相同
                if (rhymeMatch(pinyin1[0], pinyin2[0])) {
                    matchingResults.put(key, "韵母相同" + index);
                    bool = true;
                    break;
                }
            }
            if (bool) {
                continue;
            }
            matchingResults.put(key, "完全不匹配");
        }
        return matchingResults;
    }

    // 严格比较拼音的声母、韵母和声调
    private static boolean comparePinyins(String pinyin1, String pinyin2) {
        // 去除拼音的音调部分，比较音节
        String pinyin1Base = removeTone(pinyin1);
        String pinyin2Base = removeTone(pinyin2);

        // 比较拼音的基础部分（韵母和声母）及声调
        return pinyin1Base.equalsIgnoreCase(pinyin2Base) && getTone(pinyin1) == getTone(pinyin2);
    }

    // 比较声母部分是否一致
    private static boolean consonantMatch(String pinyin1, String pinyin2) {
        // 提取拼音中的声母部分
        String consonant1 = extractConsonant(pinyin1);
        String consonant2 = extractConsonant(pinyin2);

        return consonant1.equalsIgnoreCase(consonant2);
    }

    // 只比较韵母部分是否一致
    private static boolean rhymeMatch(String pinyin1, String pinyin2) {
        // 去除拼音的音调部分，得到基础拼音
        String pinyin1Base = removeTone(pinyin1);
        String pinyin2Base = removeTone(pinyin2);

        // 提取拼音中的韵母部分
        String pinyin1Rhyme = extractRhyme(pinyin1Base);
        String pinyin2Rhyme = extractRhyme(pinyin2Base);

        // 只比较韵母部分
        return pinyin1Rhyme.equalsIgnoreCase(pinyin2Rhyme);
    }

    // 去除拼音中的音调符号部分，得到拼音的基础部分（声母+韵母）
    private static String removeTone(String pinyin) {
        return pinyin.replaceAll("[1-4]", "");
    }

    // 提取拼音中的声母部分
    private static String extractConsonant(String pinyin) {
        // 声母部分的提取规则：拼音的第一个字母就是声母（假设拼音规范）
        String consonant = pinyin.substring(0, 1);
        return consonant;
    }

    // 提取拼音中的韵母部分
    private static String extractRhyme(String pinyin) {
        // 简单判断拼音中可能包含的韵母
        String[] rhymes = {"a", "o", "e", "i", "u", "v", "ai", "ei", "ao", "ou", "iu", "ie", "üe", "er", "an", "en", "in", "un", "ün", "ang", "eng", "ing", "ong"};
        for (String rhyme : rhymes) {
            if (pinyin.contains(rhyme)) {
                return rhyme; // 返回第一个匹配的韵母
            }
        }
        return ""; // 如果没有找到，返回空
    }

    // 提取拼音中的声调
    private static char getTone(String pinyin) {
        if (pinyin.contains("a") || pinyin.contains("e") || pinyin.contains("i") || pinyin.contains("o") || pinyin.contains("u")) {
            if (pinyin.endsWith("1")) {
                return '1'; // 第一声
            } else if (pinyin.endsWith("2")) {
                return '2'; // 第二声
            } else if (pinyin.endsWith("3")) {
                return '3'; // 第三声
            } else if (pinyin.endsWith("4")) {
                return '4'; // 第四声
            }
        }
        return '0'; // 没有音调标记时返回 '0'，可以视为平声
    }

    public static void main(String[] args) throws TemplateException, IOException {
        // 示例 2：字形不同，拼音完全相同
        String word1 = "触形初同";
        String word2 = "目入敷出";

        JSONObject matchingResults = getMatchingPinyinCharacters(word1, word2);
        System.out.println(matchingResults);

        List<JSONObject> list =new ArrayList<>();
        JSONObject jsonObject=new JSONObject();
        jsonObject.put("word","触");
        list.add(jsonObject);
        JSONObject jsonObject1=new JSONObject();
        jsonObject1.put("word","目");
        list.add(jsonObject1);
        JSONObject jsonObject2=new JSONObject();
        jsonObject2.put("word","惊");
        list.add(jsonObject2);
        JSONObject jsonObject3=new JSONObject();
        jsonObject3.put("word","心");
        list.add(jsonObject3);
        JSONObject jsonObject4=new JSONObject();
        jsonObject4.put("word","触");
        list.add(jsonObject4);
        JSONObject jsonObject5=new JSONObject();
        jsonObject5.put("word","心");
        list.add(jsonObject5);
        JSONObject jsonObject6=new JSONObject();
        jsonObject6.put("word","目");
        list.add(jsonObject6);
        JSONObject jsonObject7=new JSONObject();
        jsonObject7.put("word","惊");
        list.add(jsonObject7);



        //生成图片
        ModelMap modelMap = new ModelMap();
        modelMap.put("resume", list);
        String templateName = "idiom.ftl";
        String html = FreemarkeTools.ftlToString(modelMap, templateName);
        String htmlFilePath = "src/main/resources/html/idiom.html";
        UUID uuid = UUID.randomUUID();
        String imageFilePath = "src/main/resources/image/" + uuid.toString() + ".png";
        String imgPath = FreemarkeTools.turnImage(html, htmlFilePath, imageFilePath, 1000, 1000);


    }
}
